﻿#include <cstdio>
#include "graphviewer.h"
#include <fstream>
#include <iostream>
#include <sstream>
#include "Exceptions.h"
#include "Metro.h"
GraphViewer *gv;
using namespace std;

void consoleOutputText(string action)
{
	cout << "||     || |||||||| |||||||| |||||||  ||||||||" << endl
	     << "|||| |||| ||          ||    ||    || ||    ||" << endl
	     << "|| ||| || |||||||     ||    ||||||   ||    ||" << endl
	     << "||  |  || ||          ||    ||   ||  ||    ||" << endl
	     << "||     || ||||||||    ||    ||    || ||||||||" << endl << endl;

	cout << "Trabalho Realizado por: " << endl
	     << " - Carla Abreu, ei08165 " << endl
	     << " - Diogo Silva, ei07045 " << endl
	     << " - Luis Fonseca, ei10139 " << endl << endl;

	cout << "------------" << endl
	     << action << endl << endl
	     << "------------" << endl;

}

int main(int argc, const char* argv[])
{
	gv = new GraphViewer(600, 600, true);	
	gv->setBackground("metro.jpg");
	gv->createWindow(600, 600);
	gv->defineVertexColor("blue");
	gv->defineEdgeColor("black");
	gv->rearrange();
			
	if(argc == 1)
	{
		consoleOutputText("Parametros a menos.");
		return -1;
	}
	if(argc > 4)
	{
		consoleOutputText("Parametros a mais.");
		return -1;
	}
	try
	{
		consoleOutputText("Loading File");
		Metro m = Metro(argv[1], gv);
		switch(argc)
		{
		case 4:
			try
			{
				m.menorCaminho(argv[2], argv[3], gv);
			}
			catch(MetroEstacaoNaoExistente *)
			{
				cout << "Estação '" << argv[2] << "' nao existe." << endl;
			}
			break;
		case 3: // só é fornecido a origem.
			try
			{
				for(unsigned int i = 0; i < m.nEstacoes; ++i)
				{
					if(std::string(argv[2]) != m.estacoes[i]->nome)
						m.menorCaminho(argv[2], m.estacoes[i]->nome, NULL);
				}
			}
			catch(MetroEstacaoNaoExistente *)
			{
				cout << "Estação '" << argv[2] << "' nao existe." << endl;
			}
			break;
		case 2: // não é fornecido a origem nem o destino.
			try
			{
				for(unsigned int i = 0; i < m.nEstacoes; ++i)
				{
					for(unsigned int j = 0; j < m.nEstacoes; ++j)
					{
						if(m.estacoes[i]->nome != m.estacoes[j]->nome)
							m.menorCaminho(m.estacoes[i]->nome, m.estacoes[j]->nome, NULL);
					}
				}
			}
			catch(MetroEstacaoNaoExistente *)
			{
				cout << "Estação '" << argv[2] << "' nao existe." << endl;
			}
			break;

		}
	}
	catch(IOError *)
	{
		cout << "Erro ao abrir o ficheiro '" << argv[1] << "'.";
		return -1;
	}
	
	system("pause");
	return 0;
}
